/**
 * FileName: AttributesValue
 * Author: Wb
 * Date: 2025/9/26 10:39
 * Description:
 * History:
 */
package org.test.device.constant;

import lombok.Getter;

/**
 * 系统通用常量枚举类
 * 包含删除标记、设备状态、产品状态、产品物模型读取方式等常量
 *
 * @author Wb
 * @create 2025/9/26
 * @since 1.0.0
 */
@Getter
public enum AttributesValue {

    // ====================== 通用删除标记 ======================
    DELETED(1, "已删除"),
    NOT_DELETED(0, "未删除"), // 补充未删除状态，保持语义完整

    /**
     * 设备状态
     */
    DEVICE_STATUS_UNAUTHENTICATED(0, "设备未认证"),
    DEVICE_STATUS_AUTHENTICATED(1, "设备已认证"),
    DEVICE_STATUS_ENABLED(2, "设备已启用"),
    DEVICE_STATUS_DISABLED(3, "设备未启用"),

    /**
     * 产品状态
     */
    PRODUCT_STATUS_DISABLED(0, "产品禁用（不可关联设备）"),
    PRODUCT_STATUS_ENABLED(1, "产品启用（可关联设备）"),

    /**
     * 产品物模型读取方式
     */
    ACCESS_MODE_READ("read", "只读"),
    ACCESS_MODE_WRITE("write", "只写"),
    ACCESS_MODE_REPORT("report", "上报");


    // ====================== 枚举通用属性 ======================
    // 用于存储「数字类型常量」的值（如删除标记、状态码）
    private final Integer code;
    // 用于存储「字符串类型常量」的值（如 access_mode）
    private final String value;
    // 常量描述（用于日志、接口返回等场景，提高可读性）
    private final String desc;


    // ====================== 构造方法（适配不同类型常量） ======================
    // 适配「数字类型常量」（如删除标记、设备状态、产品状态）
    AttributesValue(Integer code, String desc) {
        this.code = code;
        this.value = null; // 字符串类型值为空
        this.desc = desc;
    }

    // 适配「字符串类型常量」（如 access_mode）
    AttributesValue(String value, String desc) {
        this.code = null; // 数字类型值为空
        this.value = value;
        this.desc = desc;
    }

    /**
     * 根据传入的 access_mode 字符串，判断是否为合法的读取方式
     * @param accessMode 待判断的读取方式（如 "read"、"write"）
     * @return true=合法，false=非法
     */
    public static boolean isValidAccessMode(String accessMode) {
        // 避免空指针异常：先判断传入值是否为 null
        if (accessMode == null || accessMode.trim().isEmpty()) {
            return false;
        }
        // 遍历所有 access_mode 相关枚举，匹配则合法
        for (AttributesValue mode : values()) {
            // 只判断「字符串类型常量」（即 access_mode 相关枚举）
            if (mode.value != null && mode.value.equals(accessMode.trim())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据传入的 access_mode 字符串，获取对应的枚举实例（便于后续使用描述等属性）
     * @param accessMode 待匹配的读取方式（如 "read"、"write"）
     * @return 匹配的枚举实例，无匹配则返回 null
     */
    public static AttributesValue getAccessModeEnum(String accessMode) {
        if (accessMode == null || accessMode.trim().isEmpty()) {
            return null;
        }
        for (AttributesValue mode : values()) {
            if (mode.value != null && mode.value.equals(accessMode.trim())) {
                return mode;
            }
        }
        return null;
    }



}